﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace klient {
    class Main_Client {
        private static void Main(string[] args) {
            if (!CheckArgs(args)) {
                System.Console.WriteLine();
                System.Console.WriteLine("Składnia polecenia:");
                System.Console.WriteLine("\tklient.exe {IP} {port}");
                System.Console.WriteLine("opcje:");
                System.Console.WriteLine("\tIP - adres IP serwera");
                System.Console.WriteLine("\tport - numer portu, na którym działać ma serwer (1-65535)");
                return;
            }
            Console.WriteLine("Aplikacja kliencka");
            Console.WriteLine("Adres IP: " + args[0]);
            Console.WriteLine("Port: " + args[1]);
            Console.WriteLine("Wpisz \"help\" aby uzyskać listę dostępnych poleceń.");
            Client client = new Client(args[0], Int32.Parse(args[1]));
            CommandInterpreter interpreter = new CommandInterpreter(client);
            Console.WriteLine(interpreter.ExecuteCommand("connect"));
            while (true) {
                string input = Console.ReadLine();
                try {
                    string reply = interpreter.ExecuteCommand(input);
                    Console.WriteLine(reply);
                }
                catch (Exception) {
                    break;
                }
            }
        }

        /// <summary>
        /// Sprawdza poprawność składni argumentów przekazanych do programu.
        /// </summary>
        /// <param name="args">Tablica argumentów przekazanych do programu.</param>
        /// <returns>True, gdy składnia argumentów jest poprawna, false w przeciwnym wypadku.</returns>
        private static bool CheckArgs(string[] args) {
            if (args.Length != 2) return false;
            string ipRegex = @"^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
            int port;
            if(!Int32.TryParse(args[1] ,out port)) return false;
            if (System.Text.RegularExpressions.Regex.IsMatch(args[0], ipRegex) &&
                port >= 0 &&
                port <= 65535) return true;
            else return false;
        }
    }
}
